
package com.huaweicloud.saaslanding.install.properties;

import com.huaweicloud.saaslanding.basic.enumeration.IdaasEnum;
import com.huaweicloud.saaslanding.basic.exception.BizException;
import com.huaweicloud.saaslanding.basic.utils.CheckNullUtil;
import com.huaweicloud.saaslanding.install.constant.ModelConstant;

import cn.hutool.core.util.StrUtil;
import jakarta.annotation.PostConstruct;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

/**
 * saaslanding-install.idaas
 *
 * @since 2023-04-07
 */
@Data
@Component
@Validated
@ConfigurationProperties(prefix = ModelConstant.IDAAS_PREFIX)
public class Idaas {
    @PostConstruct
    private void initCheck() {
        if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(type)) {
            if (StringUtils.isBlank(oneaccess.domain)) {
                throw new IllegalArgumentException("oneaccess.domain不能为空");
            }
        }

        if (IdaasEnum.IdaasTypeEnum.KEY_CLOAK.getName().equals(type)) {
            if (StringUtils.isBlank(keycloak.adminSecret)) {
                throw new IllegalArgumentException("keycloak.admin-secret不能为空");
            }
            if (StringUtils.isBlank(keycloak.url)) {
                throw new IllegalArgumentException("keycloak.url不能为空");
            }
        }
    }

    /**
     * idaas类型
     */
    @NotBlank(message = "idaas.type不能为空")
    @Pattern(regexp = "^keycloak|oneaccess$", message = "idaas.type目前只能为keycloak或oneaccess")
    private String type;

    /**
     * keycloak信息
     */
    private Keycloak keycloak = new Keycloak();

    /**
     * oneaccess信息
     */
    private Oneaccess oneaccess = new Oneaccess();

    /**
     * 控制台应用（https）
     */
    @Valid
    private IdaasApplicationConsole applicationHttpsConsole = new IdaasApplicationConsole();

    /**
     * 酒店应用（https）
     */
    @Valid
    private IdaasApplicationHotel applicationHttpsHotel = new IdaasApplicationHotel();

    /**
     * 电商应用（https）
     */
    @Valid
    private IdaasApplicationBusiness applicationHttpsBusiness = new IdaasApplicationBusiness();

    /**
     * 单体应用-云联（https）
     */
    private IdaasApplicationMonoCloudLink applicationHttpsMonoCloudLink = new IdaasApplicationMonoCloudLink();

    /**
     * 单体应用-License（https）
     */
    private IdaasApplicationMonoLicense applicationHttpsMonoLicense = new IdaasApplicationMonoLicense();

    /**
     * 微服务架构应用（https）
     */
    private IdaasApplicationMicro applicationHttpsMicro = new IdaasApplicationMicro();

    @Data
    @Validated
    public static class Keycloak {
        private String url;

        private String adminSecret;
    }

    @Data
    @Validated
    public static class Oneaccess {
        private String domain;
    }

    @Data
    @Validated
    public static class IdaasApplicationBusiness {
        /**
         * 应用名称
         */
        @NotEmpty(message = "应用id(application.name)不能为空")
        private String name;

        /**
         * 应用英文名称
         */
        @NotEmpty(message = "应用id(application.nameEn)不能为空")
        private String nameEn;

        /**
         * 应用架构
         */
        @NotEmpty(message = "应用id(application.architecture)不能为空")
        private String architecture;

        /**
         * 应用id
         */
        @NotEmpty(message = "应用id(application.appId)不能为空")
        private String appId;

        /**
         * 客户端id OneAccess不能为空，keycloak可以为空
         */
        private String clientId;

        /**
         * 客户端密钥 OneAccess不能为空，keycloak可以为空
         */
        private String clientSecret;

        @Value("${saaslanding-install.idaas.type}")
        private String idaasType;

        public void setClientId(String clientId) {
            checkEmpty(clientId);
            this.clientId = clientId;
        }

        public void setClientSecret(String clientSecret) {
            checkEmpty(clientSecret);
            this.clientSecret = clientSecret;
        }

        public String getClientId() {
            checkEmpty(clientId);
            return clientId;
        }

        public String getClientSecret() {
            checkEmpty(clientSecret);
            return clientSecret;
        }

        private void checkEmpty(String configStr) {
            if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) {
                // 如果是oneaccess 该配置不能为空
                if (StrUtil.isEmpty(configStr)) {
                    throw new BizException("oneaccess.clientId/clientSecret/domain 不能为空");
                }
            }
        }
    }

    @Data
    @Validated
    public static class IdaasApplicationConsole {
        /**
         * 应用名称
         */
        @NotEmpty(message = "应用id(application.name)不能为空")
        private String name;

        /**
         * 应用英文名称
         */
        @NotEmpty(message = "应用id(application.nameEn)不能为空")
        private String nameEn;

        /**
         * 应用架构
         */
        @NotEmpty(message = "应用id(application.architecture)不能为空")
        private String architecture;

        /**
         * 应用id
         */
        @NotEmpty(message = "应用id(application.appId)不能为空")
        private String appId;

        /**
         * 客户端id OneAccess不能为空，keycloak可以为空
         */
        private String clientId;

        /**
         * 客户端密钥 OneAccess不能为空，keycloak可以为空
         */
        private String clientSecret;

        @Value("${saaslanding-install.idaas.type}")
        private String idaasType;

        public void setClientId(String clientId) {
            checkEmpty(clientId);
            this.clientId = clientId;
        }

        public void setClientSecret(String clientSecret) {
            checkEmpty(clientSecret);
            this.clientSecret = clientSecret;
        }

        public String getClientId() {
            checkEmpty(clientId);
            return clientId;
        }

        public String getClientSecret() {
            checkEmpty(clientSecret);
            return clientSecret;
        }

        private void checkEmpty(String configStr) {
            if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) {
                // 如果是oneaccess 该配置不能为空
                if (StrUtil.isEmpty(configStr)) {
                    throw new BizException("oneaccess.clientId/clientSecret/domain 不能为空");
                }
            }
        }
    }

    @Data
    @Validated
    public static class IdaasApplicationHotel {
        /**
         * 应用名称
         */
        @NotEmpty(message = "应用id(application.name)不能为空")
        private String name;

        /**
         * 应用英文名称
         */
        @NotEmpty(message = "应用id(application.nameEn)不能为空")
        private String nameEn;

        /**
         * 应用架构
         */
        @NotEmpty(message = "应用id(application.architecture)不能为空")
        private String architecture;

        /**
         * 应用id
         */
        @NotEmpty(message = "应用id(application.appId)不能为空")
        private String appId;

        /**
         * 客户端id OneAccess不能为空，keycloak可以为空
         */
        private String clientId;

        /**
         * 客户端密钥 OneAccess不能为空，keycloak可以为空
         */
        private String clientSecret;

        @Value("${saaslanding-install.idaas.type}")
        private String idaasType;

        public void setClientId(String clientId) {
            checkEmpty(clientId);
            this.clientId = clientId;
        }

        public void setClientSecret(String clientSecret) {
            checkEmpty(clientSecret);
            this.clientSecret = clientSecret;
        }

        public String getClientId() {
            checkEmpty(clientId);
            return clientId;
        }

        public String getClientSecret() {
            checkEmpty(clientSecret);
            return clientSecret;
        }

        private void checkEmpty(String configStr) {
            if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) {
                // 如果是oneaccess 该配置不能为空
                if (StrUtil.isEmpty(configStr)) {
                    throw new BizException("oneaccess.clientId/clientSecret/domain 不能为空");
                }
            }
        }
    }

    @Data
    @Validated
    public static class IdaasApplicationMicro {
        /**
         * 应用是否开启
         */
        private Boolean enabled = false;

        /**
         * 应用记录ID
         */
        private Long id;

        /**
         * 应用名称
         */
        private String name;

        /**
         * 应用英文名称
         */
        private String nameEn;

        /**
         * 应用架构
         */
        private String architecture;

        /**
         * 应用 idaas app id
         */
        private String appId;

        /**
         * 客户端id OneAccess不能为空，keycloak可以为空
         */
        private String clientId;

        /**
         * 客户端密钥 OneAccess不能为空，keycloak可以为空
         */
        private String clientSecret;

        @Value("${saaslanding-install.idaas.type}")
        private String idaasType;

        public void setClientId(String clientId) {
            checkEmpty(clientId);
            this.clientId = clientId;
        }

        public void setClientSecret(String clientSecret) {
            checkEmpty(clientSecret);
            this.clientSecret = clientSecret;
        }

        public String getClientId() {
            checkEmpty(clientId);
            return clientId;
        }

        public String getClientSecret() {
            checkEmpty(clientSecret);
            return clientSecret;
        }

        private void checkEmpty(String configStr) {
            if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) {
                // 如果是oneaccess 该配置不能为空
                if (StrUtil.isEmpty(configStr)) {
                    throw new BizException("oneaccess.clientId/clientSecret/domain 不能为空");
                }
            }
        }

        public Long getId() {
            if (enabled && CheckNullUtil.isNotNull(id)) {
                return id;
            } else {
                throw new IllegalArgumentException("未启用微服务架构应用 或微服务架构应用应用记录ID为空");
            }
        }

        public String getName() {
            if (enabled && CheckNullUtil.isNotNull(name)) {
                return name;
            } else {
                throw new IllegalArgumentException("未启用微服务架构应用 或微服务架构应用应用名称为空");
            }
        }

        public String getArchitecture() {
            if (enabled && CheckNullUtil.isNotNull(architecture)) {
                return architecture;
            } else {
                throw new IllegalArgumentException("未启用微服务架构应用 或微服务架构应用应用架构为空");
            }
        }

        public String getAppId() {
            if (enabled && CheckNullUtil.isNotNull(appId)) {
                return appId;
            } else {
                throw new IllegalArgumentException("未启用微服务架构应用 或微服务架构应用应用 idaas app id为空");
            }
        }
    }

    @Data
    @Validated
    public static class IdaasApplicationMonoCloudLink {
        /**
         * 应用是否开启
         */
        private Boolean enabled = false;

        /**
         * 应用记录ID
         */
        private Long id;

        /**
         * 应用名称
         */
        private String name;

        /**
         * 应用英文名称
         */
        private String nameEn;

        /**
         * 应用架构
         */
        private String architecture;

        /**
         * 应用 idaas app id
         */
        private String appId;

        /**
         * 客户端id OneAccess不能为空，keycloak可以为空
         */
        private String clientId;

        /**
         * 客户端密钥 OneAccess不能为空，keycloak可以为空
         */
        private String clientSecret;

        @Value("${saaslanding-install.idaas.type}")
        private String idaasType;

        public void setClientId(String clientId) {
            checkEmpty(clientId);
            this.clientId = clientId;
        }

        public void setClientSecret(String clientSecret) {
            checkEmpty(clientSecret);
            this.clientSecret = clientSecret;
        }

        public String getClientId() {
            checkEmpty(clientId);
            return clientId;
        }

        public String getClientSecret() {
            checkEmpty(clientSecret);
            return clientSecret;
        }

        private void checkEmpty(String configStr) {
            if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) {
                // 如果是oneaccess 该配置不能为空
                if (StrUtil.isEmpty(configStr)) {
                    throw new BizException("oneaccess.clientId/clientSecret/domain 不能为空");
                }
            }
        }

        public Long getId() {
            if (enabled && CheckNullUtil.isNotNull(id)) {
                return id;
            } else {
                throw new IllegalArgumentException("未启用单体应用（云联）或单体应用（云联）应用记录ID为空");
            }
        }

        public String getName() {
            if (enabled && CheckNullUtil.isNotNull(name)) {
                return name;
            } else {
                throw new IllegalArgumentException("未启用单体应用（云联）或单体应用（云联）应用名称为空");
            }
        }

        public String getArchitecture() {
            if (enabled && CheckNullUtil.isNotNull(architecture)) {
                return architecture;
            } else {
                throw new IllegalArgumentException("未启用单体应用（云联）或单体应用（云联）应用架构为空");
            }
        }

        public String getAppId() {
            if (enabled && CheckNullUtil.isNotNull(appId)) {
                return appId;
            } else {
                throw new IllegalArgumentException("未启用单体应用（云联）或单体应用（云联）应用 idaas app id为空");
            }
        }
    }

    @Data
    @Validated
    public static class IdaasApplicationMonoLicense {
        /**
         * 应用是否开启
         */
        private Boolean enabled = false;

        /**
         * 应用记录ID
         */
        private Long id;

        /**
         * 应用名称
         */
        private String name;

        /**
         * 应用英文名称
         */
        private String nameEn;

        /**
         * 应用架构
         */
        private String architecture;

        /**
         * 应用 idaas app id
         */
        private String appId;

        /**
         * 客户端id OneAccess不能为空，keycloak可以为空
         */
        private String clientId;

        /**
         * 客户端密钥 OneAccess不能为空，keycloak可以为空
         */
        private String clientSecret;

        /**
         * 云商店License应用模块A名称
         */
        private String moduleAName;

        /**
         * 云商店License应用模块A协议
         */
        private String moduleAProtocol;

        /**
         * 云商店License应用模块A端口号
         */
        private Integer moduleAPort;

        /**
         * 云商店License应用模块B名称
         */
        private String moduleBName;

        /**
         * 云商店License应用模块B协议
         */
        private String moduleBProtocol;

        /**
         * 云商店License应用模块B端口号
         */
        private Integer moduleBPort;

        @Value("${saaslanding-install.idaas.type}")
        private String idaasType;

        public void setClientId(String clientId) {
            checkEmpty(clientId);
            this.clientId = clientId;
        }

        public void setClientSecret(String clientSecret) {
            checkEmpty(clientSecret);
            this.clientSecret = clientSecret;
        }

        public String getClientId() {
            checkEmpty(clientId);
            return clientId;
        }

        public String getClientSecret() {
            checkEmpty(clientSecret);
            return clientSecret;
        }

        private void checkEmpty(String configStr) {
            if (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) {
                // 如果是oneaccess 该配置不能为空
                if (StrUtil.isEmpty(configStr)) {
                    throw new BizException("oneaccess.clientId/clientSecret/domain 不能为空");
                }
            }
        }

        public Long getId() {
            if (enabled && CheckNullUtil.isNotNull(id)) {
                return id;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用应用记录ID为空");
            }
        }

        public String getName() {
            if (enabled && CheckNullUtil.isNotNull(name)) {
                return name;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用应用名称为空");
            }
        }

        public String getArchitecture() {
            if (enabled && CheckNullUtil.isNotNull(architecture)) {
                return architecture;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用应用架构为空");
            }
        }

        public String getAppId() {
            if (enabled && CheckNullUtil.isNotNull(appId)) {
                return appId;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用应用 idaas app id为空");
            }
        }

        public String getModuleAName() {
            if (enabled && CheckNullUtil.isNotNull(moduleAName)) {
                return moduleAName;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用模块A名称为空");
            }
        }

        public String getModuleAProtocol() {
            if (enabled && CheckNullUtil.isNotNull(moduleAProtocol)) {
                return moduleAProtocol;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用模块A协议为空");
            }
        }

        public Integer getModuleAPort() {
            if (enabled && CheckNullUtil.isNotNull(moduleAPort)) {
                return moduleAPort;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用模块A端口号为空");
            }
        }

        public String getModuleBName() {
            if (enabled && CheckNullUtil.isNotNull(moduleBName)) {
                return moduleBName;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用模块B名称为空");
            }
        }

        public String getModuleBProtocol() {
            if (enabled && CheckNullUtil.isNotNull(moduleBProtocol)) {
                return moduleBProtocol;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用模块B协议为空");
            }
        }

        public Integer getModuleBPort() {
            if (enabled && CheckNullUtil.isNotNull(moduleBPort)) {
                return moduleBPort;
            } else {
                throw new IllegalArgumentException("未启用云商店License应用 或 云商店License应用模块B端口号为空");
            }
        }
    }
}
